﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed

#pragma once

#include "IGeometry.h"
#include "WeakReferenceable.h"

namespace gcmp
{
    class ITrimmedCurve;
    class IFace;
    class IVertex;

    /// \brief 拓扑边
    ///
    class IEdge : public IGeometry, public WeakReferenceable
    {
    public:

        /// \brief   获取拓扑边的裁剪曲线
        /// \return  裁剪曲线
        virtual const ITrimmedCurve* GetTrimmedCurve()const = 0;

        /// \brief   判断拓扑边的方向和几何曲线方向是否一致
        /// \return  一致返回True，否则返回False
        virtual bool GetOrientation() const = 0;

        /// \brief  获取边的邻面序号
        /// \param  firstFaceIndex    第一个邻面的标识
        /// \param  secondFaceIndex   第二个邻面的标识
        /// \return  成功返回true，失败返回false
        virtual bool GetAdjacentFaceIndices(int& firstFaceIndex, int& secondFaceIndex)const = 0;

        /// \brief  获取面的标识
        /// \return  面的标识
        virtual int GetTag()const = 0;

        /// \brief  设置面的标识
        /// \param  tag   面的标识
        /// \return  成功返回true，失败返回false
        virtual bool SetTag(int tag) = 0;

        /// \brief   判断是否面的接缝边
        /// \return  是返回True，否则返回False
        virtual bool IsSeam() const = 0;

        /// \brief  获得当前三维边对应的Loop的索引，因为一条三维边会对应2个Loop，所以使用一个 2个元素的数组来表示边所对应的Loop的索引
        /// \param[in] nIndex    数组索引
        /// \return    三维边对应的Loop的索引
        virtual int GetLoopIndex(int nIndex) const = 0;

        /// \brief  获得当前三维边对应的Loop中的二维边的索引，因为一条三维边会对应2个Loop中的二维边，所以使用一个 2个元素的数组来表示边所对应的Loop中的二维边的索引
        /// \param[in] nIndex  数组索引
        /// \return    二维边的索引
        virtual int GetCoedgeIndex(int nIndex) const = 0;

        /// \brief  获得包含当前三维边的所有拓扑面
        /// \param[out] faces  拓扑面数组
        /// \return  获取成功返回true，失败返回false
        virtual bool GetFaces(std::vector<const IFace*>& faces) const = 0;

        /// \brief  获取起始和终止拓扑点
        /// 加载几何库时实现开启拓扑点生成，默认Edge没有拓扑点，开启拓扑点生成之后这个接口才有效
        /// 如果gbmp_gcmp_behavior_config默认配置的EnableVertexGeneration不为0，开启拓扑点生成
        /// \param[out] vertices  vertices[0]为起始拓扑点，vertices[1]为终止拓扑点
        /// \return  获取成功返回true，失败返回false
        virtual bool GetVertices(std::array<const IVertex*, 2>& vertices) const = 0;

    public:
        virtual ~IEdge() {}
    };
}
